#ifndef DATABASESERVICE_H
#define DATABASESERVICE_H

#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QMutex>
#include <QDebug>

/**
 * @brief 数据库服务类（单例模式）
 * @details 负责数据库初始化、建表、CRUD 操作
 *          参考 database_schema.sql 设计
 */
class DatabaseService : public QObject
{
    Q_OBJECT

public:
    // 获取单例实例
    static DatabaseService *instance();

    // 禁止拷贝构造和赋值
    DatabaseService(const DatabaseService &) = delete;
    DatabaseService &operator=(const DatabaseService &) = delete;

    // 初始化数据库（建表、配置、索引）
    bool initialize(const QString &dbPath = "modbus_monitor.db");

    // 获取数据库连接
    QSqlDatabase database() const { return m_db; }
    QString databasePath() const { return m_dbPath; }

    // 检查数据库是否已初始化
    bool isInitialized() const { return m_initialized; }

    // 关闭数据库
    void closeDatabase();

signals:
    // 数据库初始化成功信号
    void databaseInitialized(bool success);
    // 数据库初始化失败信号
    void errorOccurred(const QString &error);

private:
    explicit DatabaseService(QObject *parent = nullptr);
    ~DatabaseService();

    // 创建所有表
    bool createTables();

    // 创建索引
    bool createIndexes();

    // 创建视图
    bool createViews();

    // 初始化默认配置
    bool initializeDefaultConfig();

    // 数据库优化配置
    bool configureDatabaseOptimization();

    // 执行 SQL 语句并检查错误
    bool executeSql(const QString &sql, const QString &description);

private:
    static DatabaseService *s_instance; // 单例实例
    static QMutex s_mutex;              // 互斥锁

    QSqlDatabase m_db;   // 数据库连接
    QString m_dbPath;    // 数据库文件路径
    bool m_initialized;  // 数据库是否已初始化
};

#endif // DATABASESERVICE_H
